package com.linkai.序列化;

import java.io.*;

/**
 * @Description: 普通序列化，反序列化
 *               https://blog.csdn.net/tree_ifconfig/article/details/82766587
 *               序列化和反序列化就是通过对比其 SerialversionUID 来进行的，我们修改一个实现 Serializable 接口的实体类
 *               ，重新编译后，显然程序会重新会生成新值，那么一旦SerialversionUID 跟之前不匹配，反序列化就无法成功。
 *               所以一般我们在项目中需要自己定义一个 SerialversionUID
 * @Author: 林凯
 * @Date: 2021/10/21 22:57
 */
public class Test01 {

    // 序列化步骤
    public static void WriteObject() {
        try {
            // 序列化步骤
            // 1. 创建一个 ObjectOutputStream 输出流
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.txt"));
            // 2. 调用 ObjectOutputStream 对象的 writeObject 输出可序列化对象
            Person person = new Person("JackLin", 21);
            oos.writeObject(person);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 反序列化步骤
    public static void ReadObject() {
        try {
            // 1. 创建一个 ObjectInputStream 输入流
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.txt"));
            // 2. 调用 ObjectInputStream 对象的 readObject() 得到序列化的对象
            Person person = (Person) ois.readObject();
            System.out.println(person);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        WriteObject();
        System.out.println("==============");
        ReadObject();

        /*
            结果：
                调用了有参构造
                ==============
                Person{name='JackLin', age=21}
            说明：反序列化并不会调用构造方法。反序列的对象是由JVM自己生成的对象，不通过构造方法生成。
        * */
    }
}

//  只有实现了Serializable或者Externalizable接口的类的对象才能被序列化为字节序列。（不是则会抛出异常 RuntimeException）
class Person implements Serializable {
    private static final long serialVersionUID = 4526779457599886525L;
    private String name;
    private int age;


    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public Person() {
    }

    public Person(String name, int age) {
        System.out.println("调用了有参构造");
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}